Skip to content

#STM32串口中断异常 #串口无限进入中断 #debug

使用STM32CubeMX配置了串口中断后,实际硬件没有反应,串口接受也没有反应。反复检查了几遍,配置也并没有错误。 经过反复排查,发现CubeMX在配置串口中断没有填加使能函数 也就是下面这句

c
__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);

整体的串口初始化(默认在usart.c文件中配置)配置完成后应该与下面相似,除了我在下面代码中加入注释的部分,其余STM32CubeMX都是默认配置好的

c
void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  HAL_UART_Init(&huart2);
   /* USER CODE BEGIN USART2_UART_Init 0 */
  __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE); 		//默认不配置,需要手动添加 
  /* USER CODE END USART2_UART_Init 0 */  
}

但这样设置会导致无限进入串口中断,原因目前不明

后来发现可以这样设置:

c
//数据缓冲区
uint8_t Uart1RX_Data,Uart2RX_Data,Uart3RX_Data;
void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  HAL_UART_Init(&huart2);
   /* USER CODE BEGIN USART2_UART_Init 0 */
  HAL_UART_Receive_IT(&huart1,&Uart1RX_Data,1); 
   //__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE); 		//默认不配置,需要手动添加 
  /* USER CODE END USART2_UART_Init 0 */  
}

使用HAL_UART_Receive_IT(&huart1,&Uart1RX_Data,1); 不使用__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);

配合串口中断回调:

c
//串口接收中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_Transmit(&huart1,"Hello,EnterUART_RxCpltCallback\r\n",26,0xFFFF);
    HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);;  /* LED0 状态取反 */ 
	if(huart->Instance == USART1)
	{
 
		HAL_UART_Transmit(&huart1,&Uart1RX_Data,1,0xFFFF);
        HAL_UART_Receive_IT(&huart1,&Uart1RX_Data,1);
        
	}
	
	if(huart->Instance == USART2)
	{
 
		HAL_UART_Transmit(&huart2,&Uart2RX_Data,1,0xFFFF);
        HAL_UART_Receive_IT(&huart2,&Uart2RX_Data,1);
	}
	

	
}

可以正常实现功能:

参考链接:

STM32CubeMX串口中断配置后无效问题的解决 https://blog.csdn.net/qq_46135352/article/details/107427082

最后更新时间: